/*!
Copyright (c) 2012 Andrew Kent
(https://github.com/forward/sql-parser)
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

-----------
SQL Parser

SQL Parser is a lexer, grammar and parser for SQL written in JS.
Currently it is only capable of parsing fairly basic SELECT queries but full SQL support will hopefully come in time.
See the specs for examples of currently supported queries.
*/
(function(factory, context, baseLibId){

    var deps = [baseLibId]
         ,i, len, dep = '', missing = [];

    for(i = 0, len = deps.length; i  < len; i++){
        dep = deps[i];
        if( undefined === context[dep] ){
            missing = missing.concat([dep]);
        }            
    }
    
    if( missing.length > 0 ){
    
        if( typeof define === 'function' && define.amd ){
            
            define(missing, function(){
                var baseLib = context[baseLibId];
                factory(baseLib);                
                return baseLib.sqlParser;                
            });
            
            return;
        }
        
        throw new Error('re_sqlparser requires the following libraries: ' + missing.join(','));
        
    }
    
    factory(context[baseLibId]);
    
}(function(baseLib){

baseLib.sqlParser = function() {
    function require(path){ return require[path]; }require['./nodes'] = new function(){
   var exports = this; 
   (function() {
    var AlterTable, BooleanValue, CreateTable, Delete, DropTable, Field, FieldDef, FunctionCastValue, FunctionValue, Group, Having, Insert, Join, Limit, LiteralValue, NumberValue, Op, Order, OrderArgument, QueryPlan, Select, Star, StringValue, SubQuery, SubSelect, Table, Union, Update, Where, indent;

    indent = function(str) {
        var line;
        return ((function() {
            var _i, _len, _ref, _results;
            _ref = str.split("\n");
            _results = [];
            for (_i = 0, _len = _ref.length; _i < _len; _i++) {
                line = _ref[_i];
                _results.push("  " + line);
            }
            return _results;
        })()).join("\n");
    };

    exports.QueryPlan = QueryPlan = (function() {
        function QueryPlan(query) {
            this.query = query;
        }

        return QueryPlan;

    })();

    exports.Select = Select = (function() {
        function Select(fields, source, distinct, joins, unions) {
            this.fields = fields;
            this.source = source;
            this.distinct = distinct != null ? distinct : false;
            this.joins = joins != null ? joins : [];
            this.unions = unions != null ? unions : [];
            this.order = null;
            this.group = null;
            this.where = null;
            this.limit = null;
        }

        Select.prototype.toString = function() {
            var join, ret, union, _i, _j, _len, _len1, _ref, _ref1;
            ret = ["SELECT " + (this.fields.join(', '))];
            ret.push(indent("FROM " + this.source));
            _ref = this.joins;
            for (_i = 0, _len = _ref.length; _i < _len; _i++) {
                join = _ref[_i];
                ret.push(indent(join.toString()));
            }
            if (this.where) {
                ret.push(indent(this.where.toString()));
            }
            if (this.group) {
                ret.push(indent(this.group.toString()));
            }
            if (this.order) {
                ret.push(indent(this.order.toString()));
            }
            if (this.limit) {
                ret.push(indent(this.limit.toString()));
            }
            _ref1 = this.unions;
            for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
                union = _ref1[_j];
                ret.push(union.toString());
            }
            return ret.join("\n");
        };

        return Select;

    })();

    exports.Insert = Insert = (function() {
        function Insert(target, insertExpression, fields) {
            this.target = target;
            this.insertExpression = insertExpression;
            this.fields = fields;
        }

        Insert.prototype.toString = function() {
            var ret;
            return ret = "";
        };

        return Insert;

    })();

    exports.Delete = Delete = (function() {
        function Delete(target, deleteCondition) {
            this.target = target;
            this.deleteCondition = deleteCondition;
        }

        Delete.prototype.toString = function() {
            var ret;
            return ret = "";
        };

        return Delete;

    })();

    exports.Update = Update = (function() {
        function Update(target, assignList, updateCondition) {
            this.target = target;
            this.assignList = assignList;
            this.updateCondition = updateCondition;
        }

        Update.prototype.toString = function() {
            var ret;
            return ret = "";
        };

        return Update;

    })();

    exports.CreateTable = CreateTable = (function() {
        function CreateTable(target, fieldDef, ifNotExists) {
            this.target = target;
            this.fieldDef = fieldDef;
            this.ifNotExists = ifNotExists != null ? ifNotExists : false;
        }

        CreateTable.prototype.toString = function() {
            var ret;
            return ret = "";
        };

        return CreateTable;

    })();

    exports.DropTable = DropTable = (function() {
        function DropTable(target, ifExists) {
            this.target = target;
            this.ifExists = ifExists != null ? ifExists : false;
            this.isDrop = true;
        }

        DropTable.prototype.toString = function() {
            var ret;
            return ret = "";
        };

        return DropTable;

    })();

    exports.AlterTable = AlterTable = (function() {
        function AlterTable(target, newName) {
            this.target = target;
            this.newName = newName;
        }

        AlterTable.prototype.toString = function() {
            var ret;
            return ret = "";
        };

        return AlterTable;

    })();

    exports.SubSelect = SubSelect = (function() {
        function SubSelect(select, name) {
            this.select = select;
            this.name = name != null ? name : null;
        }

        SubSelect.prototype.toString = function() {
            var ret;
            ret = [];
            ret.push('(');
            ret.push(indent(this.select.toString()));
            ret.push(this.name ? ") " + (this.name.toString()) : ")");
            return ret.join("\n");
        };

        return SubSelect;

    })();

    exports.SubQuery = SubQuery = (function() {
        function SubQuery(select) {
            this.select = select;
            this.fields = this.select.fields;
            this.source = this.select.source;
            this.distinct = this.select.distinct;
            this.joins = this.select.joins;
            this.unions = this.select.unions;
            this.group = this.select.group;
            this.where = this.select.where;
            delete this.select;
        }

        SubQuery.prototype.toString = function() {
            var join, ret, union, _i, _j, _len, _len1, _ref, _ref1;
            ret = ["SELECT " + (this.fields.join(', '))];
            ret.push(indent("FROM " + this.source));
            _ref = this.joins;
            for (_i = 0, _len = _ref.length; _i < _len; _i++) {
                join = _ref[_i];
                ret.push(indent(join.toString()));
            }
            if (this.where) {
                ret.push(indent(this.where.toString()));
            }
            if (this.group) {
                ret.push(indent(this.group.toString()));
            }
            _ref1 = this.unions;
            for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
                union = _ref1[_j];
                ret.push(union.toString());
            }
            return ret.join("\n");
        };

        return SubQuery;

    })();

    exports.Join = Join = (function() {
        function Join(right, conditions, side, mode) {
            this.right = right;
            this.conditions = conditions != null ? conditions : null;
            this.side = side != null ? side : null;
            this.mode = mode != null ? mode : 'INNER';
        }

        Join.prototype.toString = function() {
            var ret;
            ret = '';
            if (this.side != null) {
                ret += "" + this.side + " ";
            }
            if (this.mode != null) {
                ret += "" + this.mode + " ";
            }
            return ret + ("JOIN " + this.right + "\n") + indent("ON " + this.conditions);
        };

        return Join;

    })();

    exports.Union = Union = (function() {
        function Union(query, all) {
            this.query = query;
            this.all = all != null ? all : false;
        }

        Union.prototype.toString = function() {
            var all;
            all = this.all ? ' ALL' : '';
            return "UNION" + all + "\n" + (this.query.toString());
        };

        return Union;

    })();

    exports.LiteralValue = LiteralValue = (function() {
        function LiteralValue(value, value2) {
            this.value = value;
            this.value2 = value2 != null ? value2 : null;
            if (this.value2) {
                this.nested = true;
                this.values = this.value.values;
                this.values.push(value2);
            }
            else {
                this.nested = false;
                this.values = [this.value];
            }
        }

        LiteralValue.prototype.toString = function() {
            return "" + (this.values.join('.'));
        };

        return LiteralValue;

    })();

    exports.StringValue = StringValue = (function() {
        function StringValue(value, quoteType) {
            this.value = value;
            this.quoteType = quoteType != null ? quoteType : "''";
        }

        StringValue.prototype.toString = function() {
            return "" + this.quoteType + this.value + this.quoteType;
        };

        return StringValue;

    })();

    exports.NumberValue = NumberValue = (function() {
        function NumberValue(value, sign) {
            this.value = value;
            this.sign = sign != null ? sign : '+';
            this.value = (function() {
                switch (sign) {
                    case '-':
                        return Number(value) * -1;
                    default:
                        return Number(value);
                }
            })();
        }

        NumberValue.prototype.toString = function() {
            if (this.value < 0) {
                return '-' + this.value.toString();
            }
            else {
                return this.value.toString();
            }
        };

        return NumberValue;

    })();

    exports.BooleanValue = BooleanValue = (function() {
        function BooleanValue(value) {
            this.value = (function() {
                switch (value.toLowerCase()) {
                    case 'true':
                        return true;
                    case 'false':
                        return false;
                    default:
                        return null;
                }
            })();
        }

        BooleanValue.prototype.toString = function() {
            if (this.value != null) {
                return this.value.toString().toUpperCase();
            }
            else {
                return 'NULL';
            }
        };

        return BooleanValue;

    })();

    exports.FunctionValue = FunctionValue = (function() {
        function FunctionValue(name, _arguments, udf, isDistinct) {
            var _name;
            this.name = name;
            this["arguments"] = _arguments != null ? _arguments : [];
            this.udf = udf != null ? udf : false;
            _name = name.toLowerCase();
            if (!(_name === "count" || _name === "avg") && isDistinct === true) {
                throw new Error("Parser Error -- only count function should have distinct.");
            }
            if (_name === "count" || _name === "avg") {
                this["arguments"][1] = isDistinct;
            }
        }

        FunctionValue.prototype.toString = function() {
            return "" + this.name + "(" + (this["arguments"].join(', ')) + ")";
        };

        return FunctionValue;

    })();

    exports.FunctionCastValue = FunctionCastValue = (function() {
        function FunctionCastValue(name, expression, toType) {
            this.name = name;
            this.expression = expression;
            this.toType = toType;
        }

        FunctionCastValue.prototype.toString = function() {
            return "" + this.name + "(" + this.expression + " AS " + this.toType + ")";
        };

        return FunctionCastValue;

    })();

    exports.Order = Order = (function() {
        function Order(orderings) {
            this.orderings = orderings;
        }

        Order.prototype.toString = function() {
            return "ORDER BY " + (this.orderings.join(', '));
        };

        return Order;

    })();

    exports.OrderArgument = OrderArgument = (function() {
        function OrderArgument(value, direction, collation) {
            this.value = value;
            this.direction = direction != null ? direction : 'ASC';
            this.collation = collation != null ? collation : "";
        }

        OrderArgument.prototype.toString = function() {
            return "" + this.value + " " + this.collation + " " + this.direction;
        };

        return OrderArgument;

    })();

    exports.Limit = Limit = (function() {
        function Limit(pageNo, numRows) {
            this.pageNo = pageNo != null ? pageNo : null;
            this.numRows = numRows;
        }

        Limit.prototype.toString = function() {
            if (this.pageNo) {
                return "LIMIT " + this.numRows;
            }
            else {
                return "LIMIT " + this.pageNo + ", " + this.numRows;
            }
        };

        return Limit;

    })();

    exports.Table = Table = (function() {
        function Table(name, win, winFn, winArg) {
            this.name = name;
            this.win = win != null ? win : null;
            this.winFn = winFn != null ? winFn : null;
            this.winArg = winArg != null ? winArg : null;
        }

        Table.prototype.toString = function() {
            if (this.win) {
                return "" + this.name + "." + this.win + ":" + this.winFn + "(" + this.winArg + ")";
            }
            else {
                return this.name.toString();
            }
        };

        return Table;

    })();

    exports.Group = Group = (function() {
        function Group(fields) {
            this.fields = fields;
            this.having = null;
        }

        Group.prototype.toString = function() {
            var ret;
            ret = ["GROUP BY " + (this.fields.join(', '))];
            if (this.having) {
                ret.push(this.having.toString());
            }
            return ret.join("\n");
        };

        return Group;

    })();

    exports.Where = Where = (function() {
        function Where(conditions) {
            this.conditions = conditions;
        }

        Where.prototype.toString = function() {
            return "WHERE " + this.conditions;
        };

        return Where;

    })();

    exports.Having = Having = (function() {
        function Having(conditions) {
            this.conditions = conditions;
        }

        Having.prototype.toString = function() {
            return "HAVING " + this.conditions;
        };

        return Having;

    })();

    exports.Op = Op = (function() {
        function Op(operation, left, right) {
            this.operation = operation;
            this.left = left;
            this.right = right;
        }

        Op.prototype.toString = function() {
            return "(" + this.left + " " + this.operation + " " + this.right + ")";
        };

        return Op;

    })();

    exports.Field = Field = (function() {
        function Field(field, name) {
            this.field = field;
            this.name = name != null ? name : null;
        }

        Field.prototype.toString = function() {
            if (this.name) {
                return "" + this.field + " AS " + this.name;
            }
            else {
                return this.field.toString();
            }
        };

        return Field;

    })();

    exports.FieldDef = FieldDef = (function() {
        function FieldDef(field, type, isNullable, isPK, isAutoInc) {
            this.field = field;
            this.type = type;
            this.isNullable = isNullable;
            this.isPK = isPK;
            this.isAutoInc = isAutoInc;
        }

        FieldDef.prototype.toString = function() {
            return "";
        };

        return FieldDef;

    })();

    exports.Star = Star = (function() {
        function Star(literal) {
            this.literal = literal;
            this.star = true;
        }

        Star.prototype.toString = function() {
            return "" + this.literal + "*";
        };

        return Star;

    })();

}).call(this);
};
require['./lexer'] = new function(){
   var exports = this; 
   (function() {
    var Lexer;

    Lexer = (function() {
        var BOOLEAN, DBLSTRING, DIRECTIVES, FIELD_DEF_NOT_NULL, LITERAL, MATH, MATH_MULTI, NUMBER, PARAM_PLACEHOLDER, SEPARATOR, SQL_CONDITIONALS, SQL_FUNCTIONS, SQL_KEYWORDS, SQL_OPERATORS, SQL_SORT_ORDERS, STAR, STRING, STRING_OP, WHITESPACE;

        function Lexer(sql, opts) {
            var bytesConsumed, i;
            if (opts == null) {
                opts = {};
            }
            this.sql = sql;
            this.preserveWhitespace = opts.preserveWhitespace || false;
            this.tokens = [];
            this.params = [];
            this.currentLine = 1;
            i = 0;
            while (this.chunk = sql.slice(i)) {
                bytesConsumed = this.stringToken() || this.whitespaceToken() || this.parensToken() || this.seperatorToken() || this.directivesToken() || this.keywordToken() || this.numberToken() || this.starToken() || this.booleanToken() || this.functionToken() || this.sortOrderToken() || this.operatorToken() || this.mathToken() || this.stringOpToken() || this.dotToken() || this.conditionalToken() || this.bracketsToken() || this.literalToken() || this.paramToken();
                if (bytesConsumed < 1) {
                    break;
                }
                i += bytesConsumed;
            }
            this.token('EOF', '');
        }

        Lexer.prototype.token = function(name, value) {
            var result;
            result = this.tokens.push([name, value, this.currentLine]);
            if (name === "PARAM_PLACEHOLDER") {
                this.params.push([this.tokens.length - 1, name]);
            }
            return result;
        };

        Lexer.prototype.tokenizeFromRegex = function(name, regex, part, lengthPart, output) {
            var lstIndex, match, partMatch, quote;
            if (part == null) {
                part = 0;
            }
            if (lengthPart == null) {
                lengthPart = part;
            }
            if (output == null) {
                output = true;
            }
            if (!(match = regex.exec(this.chunk))) {
                return 0;
            }
            partMatch = match[part];
            if (output) {
                lstIndex = this.tokens.length - 1;
            }
            if (this.tokens[lstIndex] && this.tokens[lstIndex][0] === name && (name === 'DBLSTRING' || name === 'STRING')) {
                quote = (function() {
                    switch (name) {
                        case 'DBLSTRING':
                            return '"';
                        default:
                            return "'";
                    }
                })();
                this.tokens[lstIndex][1] = this.tokens[lstIndex][1] + quote + partMatch;
            }
            else {
                if (name === 'RIGHT_BRACKET' && this.tokens[lstIndex][0] !== 'LITERAL') {
                    this.tokens[lstIndex][0] = 'LITERAL';
                }
                this.token(name, partMatch);
            }
            return match[lengthPart].length;
        };

        Lexer.prototype.tokenizeFromWord = function(name, word) {
            var match, matcher;
            if (word == null) {
                word = name;
            }
            word = this.regexEscape(word);
            matcher = /^\w+$/.test(word) ? new RegExp("^(" + word + ")\\b", 'ig') : new RegExp("^(" + word + ")", 'ig');
            match = matcher.exec(this.chunk);
            if (!match) {
                return 0;
            }
            this.token(name, match[1]);
            return match[1].length;
        };

        Lexer.prototype.tokenizeFromList = function(name, list) {
            var entry, ret, _i, _len;
            ret = 0;
            for (_i = 0, _len = list.length; _i < _len; _i++) {
                entry = list[_i];
                ret = this.tokenizeFromWord(name, entry);
                if (ret > 0) {
                    break;
                }
            }
            return ret;
        };

        Lexer.prototype.keywordToken = function() {
            return this.tokenizeFromWord('INSERT') || this.tokenizeFromWord('INTO') || this.tokenizeFromWord('VALUES') || this.tokenizeFromWord('SELECT') || this.tokenizeFromWord('DISTINCT') || this.tokenizeFromWord('FROM') || this.tokenizeFromWord('WHERE') || this.tokenizeFromWord('GROUP') || this.tokenizeFromWord('ORDER') || this.tokenizeFromWord('BY') || this.tokenizeFromWord('HAVING') || this.tokenizeFromWord('LIMIT') || this.tokenizeFromWord('JOIN') || this.tokenizeFromWord('LEFT') || this.tokenizeFromWord('RIGHT') || this.tokenizeFromWord('INNER') || this.tokenizeFromWord('OUTER') || this.tokenizeFromWord('ON') || this.tokenizeFromWord('AS') || this.tokenizeFromWord('UNION') || this.tokenizeFromWord('ALL') || this.tokenizeFromWord('DELETE') || this.tokenizeFromWord('UPDATE') || this.tokenizeFromWord('SET') || this.tokenizeFromWord('CREATE') || this.tokenizeFromWord('TABLE') || this.tokenizeFromWord('PRIMARY') || this.tokenizeFromWord('KEY') || this.tokenizeFromWord('AUTOINCREMENT') || this.tokenizeFromWord('DROP') || this.tokenizeFromWord('ALTER') || this.tokenizeFromWord('RENAME') || this.tokenizeFromWord('TO') || this.tokenizeFromWord('NOT') || this.tokenizeFromWord('IN') || this.tokenizeFromWord('COLLATE') || this.tokenizeFromWord('NOCASE') || this.tokenizeFromWord('EXPLAIN') || this.tokenizeFromWord('QUERY') || this.tokenizeFromWord('PLAN') || this.tokenizeFromWord('CASE') || this.tokenizeFromWord('WHEN') || this.tokenizeFromWord('THEN') || this.tokenizeFromWord('ELSE') || this.tokenizeFromWord('END');
        };

        Lexer.prototype.dotToken = function() {
            return this.tokenizeFromWord('DOT', '.');
        };

        Lexer.prototype.operatorToken = function() {
            return this.tokenizeFromList('OPERATOR', SQL_OPERATORS);
        };

        Lexer.prototype.mathToken = function() {
            return this.tokenizeFromList('MATH', MATH) || this.tokenizeFromList('MATH_MULTI', MATH_MULTI);
        };

        Lexer.prototype.stringOpToken = function() {
            return this.tokenizeFromList('STRING_OP', STRING_OP);
        };

        Lexer.prototype.paramToken = function() {
            return this.tokenizeFromList('PARAM_PLACEHOLDER', PARAM_PLACEHOLDER);
        };

        Lexer.prototype.conditionalToken = function() {
            return this.tokenizeFromList('CONDITIONAL', SQL_CONDITIONALS);
        };

        Lexer.prototype.functionToken = function() {
            return this.tokenizeFromList('FUNCTION', SQL_FUNCTIONS);
        };

        Lexer.prototype.sortOrderToken = function() {
            return this.tokenizeFromList('DIRECTION', SQL_SORT_ORDERS);
        };

        Lexer.prototype.booleanToken = function() {
            return this.tokenizeFromList('BOOLEAN', BOOLEAN);
        };

        Lexer.prototype.directivesToken = function() {
            return this.tokenizeFromWord('FIELD_DEF_NOT_NULL', FIELD_DEF_NOT_NULL) || this.tokenizeFromList('DIRECTIVES', DIRECTIVES);
        };

        Lexer.prototype.starToken = function() {
            return this.tokenizeFromRegex('STAR', STAR);
        };

        Lexer.prototype.seperatorToken = function() {
            return this.tokenizeFromRegex('SEPARATOR', SEPARATOR);
        };

        Lexer.prototype.literalToken = function() {
            return this.tokenizeFromRegex('LITERAL', LITERAL, 1, 0);
        };

        Lexer.prototype.numberToken = function() {
            return this.tokenizeFromRegex('NUMBER', NUMBER);
        };

        Lexer.prototype.stringToken = function() {
            return this.tokenizeFromRegex('STRING', STRING, 1, 0) || this.tokenizeFromRegex('DBLSTRING', DBLSTRING, 1, 0);
        };

        Lexer.prototype.bracketsToken = function() {
            return this.tokenizeFromRegex('LEFT_BRACKET', /^\[/) || this.tokenizeFromRegex('RIGHT_BRACKET', /^\]/);
        };

        Lexer.prototype.parensToken = function() {
            return this.tokenizeFromRegex('LEFT_PAREN', /^\(/) || this.tokenizeFromRegex('RIGHT_PAREN', /^\)/);
        };

        Lexer.prototype.windowExtension = function() {
            var match;
            match = /^\.(win):(length|time)/i.exec(this.chunk);
            if (!match) {
                return 0;
            }
            this.token('WINDOW', match[1]);
            this.token('WINDOW_FUNCTION', match[2]);
            return match[0].length;
        };

        Lexer.prototype.whitespaceToken = function() {
            var match, newlines, partMatch;
            if (!(match = WHITESPACE.exec(this.chunk))) {
                return 0;
            }
            partMatch = match[0];
            newlines = partMatch.replace(/[^\n]/, '').length;
            this.currentLine += newlines;
            if (this.preserveWhitespace) {
                this.token(name, partMatch);
            }
            return partMatch.length;
        };

        Lexer.prototype.regexEscape = function(str) {
            return str.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
        };

        SQL_KEYWORDS = ['SELECT', 'FROM', 'WHERE', 'GROUP BY', 'ORDER BY', 'HAVING', 'AS', 'INSERT', 'INTO', 'UPDATE', 'SET', 'DELETE', 'CREATE TABLE', 'PRIMARY KEY', 'AUTOINCREMENT', 'DROP TABLE', 'IN', 'COLLATE NOCASE', 'EXPLAIN QUERY PLAN'];

        SQL_FUNCTIONS = ['AVG', 'COUNT', 'MIN', 'MAX', 'SUM', 'CAST'];

        SQL_SORT_ORDERS = ['ASC', 'DESC'];

        SQL_OPERATORS = ['<=', '>=', '<>', '==', '!=', '=', '>', '<', 'LIKE', 'IS NOT', 'IS'];

        SQL_CONDITIONALS = ['AND', 'OR'];

        BOOLEAN = ['TRUE', 'FALSE', 'NULL'];

        STRING_OP = ['||'];

        MATH = ['+', '-'];

        MATH_MULTI = ['/', '*'];

        FIELD_DEF_NOT_NULL = 'NOT NULL';

        DIRECTIVES = ['NOT NULL', 'IF NOT EXISTS', 'IF EXISTS'];

        STAR = /^\*/;

        SEPARATOR = /^,/;

        WHITESPACE = /^[ \n\r\t]+/;

        LITERAL = /^`?([a-z_][a-z0-9_]{0,})`?/i;

        NUMBER = /^[0-9]+(\.[0-9]+)?/;

        STRING = /^'([^']*)'/;

        DBLSTRING = /^"([^"]*)"/;

        PARAM_PLACEHOLDER = ['?'];

        return Lexer;

    })();

    exports.tokenize = function(sql, opts) {
        return (new Lexer(sql, opts)).tokens;
    };

    exports.tokenize2 = function(sql, opts) {
        var lexer;
        lexer = new Lexer(sql, opts);
        return {
            tokens: lexer.tokens,
            placeholders: lexer.params
        };
    };

}).call(this);
};
require['./gen_parser'] = new function(){
   var exports = this; 
   /* parser generated by jison 0.4.13 */
/*
  Returns a Parser object of the following structure:

  Parser: {
    yy: {}
  }

  Parser.prototype: {
    yy: {},
    trace: function(),
    symbols_: {associative list: name ==> number},
    terminals_: {associative list: number ==> name},
    productions_: [...],
    performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),
    table: [...],
    defaultActions: {...},
    parseError: function(str, hash),
    parse: function(input),

    lexer: {
        EOF: 1,
        parseError: function(str, hash),
        setInput: function(input),
        input: function(),
        unput: function(str),
        more: function(),
        less: function(n),
        pastInput: function(),
        upcomingInput: function(),
        showPosition: function(),
        test_match: function(regex_match_array, rule_index),
        next: function(),
        lex: function(),
        begin: function(condition),
        popState: function(),
        _currentRules: function(),
        topState: function(),
        pushState: function(condition),

        options: {
            ranges: boolean           (optional: true ==> token location info will include a .range[] member)
            flex: boolean             (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)
            backtrack_lexer: boolean  (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)
        },

        performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),
        rules: [...],
        conditions: {associative list: name ==> set},
    }
  }


  token location info (@$, _$, etc.): {
    first_line: n,
    last_line: n,
    first_column: n,
    last_column: n,
    range: [start_number, end_number]       (where the numbers are indexes into the input string, regular zero-based)
  }


  the parseError function receives a 'hash' object with these members for lexer and parser errors: {
    text:        (matched text)
    token:       (the produced terminal token, if any)
    line:        (yylineno)
  }
  while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {
    loc:         (yylloc)
    expected:    (string describing the set of expected tokens)
    recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)
  }
*/
var parser = (function(){
var parser = {trace: function trace() { },
yy: {},
symbols_: {"error":2,"Root":3,"AllQuery":4,"EOF":5,"Query":6,"ExplainQuery":7,"EXPLAIN":8,"QUERY":9,"PLAN":10,"SelectExpression":11,"InsertQuery":12,"DeleteQuery":13,"UpdateQuery":14,"CreateTableQuery":15,"DropTableQuery":16,"AlterTableQuery":17,"SelectQuery":18,"Unions":19,"SelectWithLimitQuery":20,"BasicSelectQuery":21,"Select":22,"OrderClause":23,"GroupClause":24,"LimitClause":25,"SelectClause":26,"WhereClause":27,"SELECT":28,"Fields":29,"FROM":30,"Table":31,"DISTINCT":32,"Joins":33,"INSERT":34,"INTO":35,"Literal":36,"VALUES":37,"LEFT_PAREN":38,"ArgumentList":39,"RIGHT_PAREN":40,"DELETE":41,"UPDATE":42,"SET":43,"AssignmentList":44,"CREATE":45,"TABLE":46,"FieldDefList":47,"DIRECTIVES":48,"DROP":49,"ALTER":50,"RENAME":51,"TO":52,"AS":53,"WINDOW":54,"WINDOW_FUNCTION":55,"Number":56,"SubQuery":57,"Union":58,"UNION":59,"ALL":60,"Join":61,"JOIN":62,"ON":63,"Expression":64,"LEFT":65,"RIGHT":66,"INNER":67,"OUTER":68,"SEPARATOR":69,"WHERE":70,"LIMIT":71,"ORDER":72,"BY":73,"OrderArgs":74,"OrderArg":75,"DIRECTION":76,"COLLATE":77,"NOCASE":78,"GroupBasicClause":79,"HavingClause":80,"GROUP":81,"HAVING":82,"CaseConditions":83,"CaseCondition":84,"WHEN":85,"THEN":86,"STRING_OP":87,"MATH":88,"MATH_MULTI":89,"OPERATOR":90,"CONDITIONAL":91,"NOT":92,"IN":93,"CASE":94,"END":95,"ELSE":96,"Value":97,"Boolean":98,"String":99,"Function":100,"UserFunction":101,"PlaceHolder":102,"LITERAL":103,"LEFT_BRACKET":104,"RIGHT_BRACKET":105,"DOT":106,"FUNCTION":107,"NUMBER":108,"BOOLEAN":109,"STRING":110,"DBLSTRING":111,"STAR":112,"PARAM_PLACEHOLDER":113,"Field":114,"FieldDef":115,"FIELD_DEF_NOT_NULL":116,"PRIMARY":117,"KEY":118,"AUTOINCREMENT":119,"$accept":0,"$end":1},
terminals_: {2:"error",5:"EOF",8:"EXPLAIN",9:"QUERY",10:"PLAN",28:"SELECT",30:"FROM",32:"DISTINCT",34:"INSERT",35:"INTO",37:"VALUES",38:"LEFT_PAREN",40:"RIGHT_PAREN",41:"DELETE",42:"UPDATE",43:"SET",45:"CREATE",46:"TABLE",48:"DIRECTIVES",49:"DROP",50:"ALTER",51:"RENAME",52:"TO",53:"AS",54:"WINDOW",55:"WINDOW_FUNCTION",59:"UNION",60:"ALL",62:"JOIN",63:"ON",65:"LEFT",66:"RIGHT",67:"INNER",68:"OUTER",69:"SEPARATOR",70:"WHERE",71:"LIMIT",72:"ORDER",73:"BY",76:"DIRECTION",77:"COLLATE",78:"NOCASE",81:"GROUP",82:"HAVING",85:"WHEN",86:"THEN",87:"STRING_OP",88:"MATH",89:"MATH_MULTI",90:"OPERATOR",91:"CONDITIONAL",92:"NOT",93:"IN",94:"CASE",95:"END",96:"ELSE",103:"LITERAL",104:"LEFT_BRACKET",105:"RIGHT_BRACKET",106:"DOT",107:"FUNCTION",108:"NUMBER",109:"BOOLEAN",110:"STRING",111:"DBLSTRING",112:"STAR",113:"PARAM_PLACEHOLDER",116:"FIELD_DEF_NOT_NULL",117:"PRIMARY",118:"KEY",119:"AUTOINCREMENT"},
productions_: [0,[3,2],[4,1],[4,1],[7,4],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[11,1],[11,2],[18,1],[18,1],[21,1],[21,2],[21,2],[21,3],[20,2],[22,1],[22,2],[26,4],[26,5],[26,5],[26,6],[12,7],[12,4],[12,10],[12,7],[13,3],[13,4],[14,4],[14,5],[15,6],[15,7],[16,3],[16,4],[17,6],[31,1],[31,3],[31,2],[31,3],[31,4],[31,5],[31,6],[57,3],[19,1],[19,2],[58,2],[58,3],[33,1],[33,2],[61,4],[61,5],[61,5],[61,6],[61,5],[61,6],[61,6],[61,6],[61,2],[27,2],[25,2],[25,4],[23,3],[74,1],[74,3],[75,1],[75,2],[75,3],[75,4],[24,1],[24,2],[79,3],[80,2],[83,1],[83,2],[84,4],[64,1],[64,3],[64,3],[64,3],[64,3],[64,3],[64,3],[64,6],[64,4],[64,5],[64,3],[64,3],[64,4],[64,5],[64,6],[64,1],[97,1],[97,1],[97,1],[97,1],[97,1],[97,1],[97,1],[36,1],[36,3],[36,3],[36,1],[56,1],[56,2],[98,1],[99,1],[99,1],[100,6],[100,4],[100,4],[100,5],[101,4],[102,1],[39,1],[39,3],[44,1],[44,3],[29,1],[29,3],[114,1],[114,3],[114,1],[114,3],[114,3],[47,1],[47,3],[115,1],[115,2],[115,3],[115,5],[115,6],[115,4],[115,5]],
performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {
/* this == yyval */

var $0 = $$.length - 1;
switch (yystate) {
case 1:return this.$ = $$[$0-1];
break;
case 2:this.$ = $$[$0];
break;
case 3:this.$ = $$[$0];
break;
case 4:this.$ = new yy.QueryPlan($$[$0]);
break;
case 5:this.$ = $$[$0];
break;
case 6:this.$ = $$[$0];
break;
case 7:this.$ = $$[$0];
break;
case 8:this.$ = $$[$0];
break;
case 9:this.$ = $$[$0];
break;
case 10:this.$ = $$[$0];
break;
case 11:this.$ = $$[$0];
break;
case 12:this.$ = $$[$0];
break;
case 13:this.$ = (function () {
                $$[$0-1].unions = $$[$0];
                return $$[$0-1];
            }());
break;
case 14:this.$ = $$[$0];
break;
case 15:this.$ = $$[$0];
break;
case 16:this.$ = $$[$0];
break;
case 17:this.$ = (function () {
                $$[$0-1].order = $$[$0];
                return $$[$0-1];
            }());
break;
case 18:this.$ = (function () {
                $$[$0-1].group = $$[$0];
                return $$[$0-1];
            }());
break;
case 19:this.$ = (function () {
                $$[$0-2].group = $$[$0-1];
                $$[$0-2].order = $$[$0];
                return $$[$0-2];
            }());
break;
case 20:this.$ = (function () {
                $$[$0-1].limit = $$[$0];
                return $$[$0-1];
            }());
break;
case 21:this.$ = $$[$0];
break;
case 22:this.$ = (function () {
                $$[$0-1].where = $$[$0];
                return $$[$0-1];
            }());
break;
case 23:this.$ = new yy.Select($$[$0-2], $$[$0], false);
break;
case 24:this.$ = new yy.Select($$[$0-2], $$[$0], true);
break;
case 25:this.$ = new yy.Select($$[$0-3], $$[$0-1], false, $$[$0]);
break;
case 26:this.$ = new yy.Select($$[$0-3], $$[$0-1], true, $$[$0]);
break;
case 27:this.$ = new yy.Insert($$[$0-4], $$[$0-1]);
break;
case 28:this.$ = new yy.Insert($$[$0-1], $$[$0]);
break;
case 29:this.$ = new yy.Insert($$[$0-7], $$[$0-1], $$[$0-5]);
break;
case 30:this.$ = new yy.Insert($$[$0-4], $$[$0], $$[$0-2]);
break;
case 31:this.$ = new yy.Delete($$[$0]);
break;
case 32:this.$ = new yy.Delete($$[$0-1], $$[$0]);
break;
case 33:this.$ = new yy.Update($$[$0-2], $$[$0]);
break;
case 34:this.$ = new yy.Update($$[$0-3], $$[$0-1], $$[$0]);
break;
case 35:this.$ = new yy.CreateTable($$[$0-3], $$[$0-1]);
break;
case 36:this.$ = new yy.CreateTable($$[$0-3], $$[$0-1], true);
break;
case 37:this.$ = new yy.DropTable($$[$0], false);
break;
case 38:this.$ = new yy.DropTable($$[$0], true);
break;
case 39:this.$ = new yy.AlterTable($$[$0-3], $$[$0]);
break;
case 40:this.$ = new yy.Table($$[$0]);
break;
case 41:this.$ = new yy.Table($$[$0-2], $$[$0]);
break;
case 42:this.$ = new yy.Table($$[$0-1], $$[$0]);
break;
case 43:this.$ = new yy.SubSelect($$[$0-1]);
break;
case 44:this.$ = new yy.SubSelect($$[$0-2], $$[$0]);
break;
case 45:this.$ = new yy.SubSelect($$[$0-3], $$[$0]);
break;
case 46:this.$ = new yy.Table($$[$0-5], $$[$0-4], $$[$0-3], $$[$0-1]);
break;
case 47:this.$ = new yy.SubQuery($$[$0-1]);
break;
case 48:this.$ = [$$[$0]];
break;
case 49:this.$ = $$[$0-1].concat($$[$0]);
break;
case 50:this.$ = new yy.Union($$[$0]);
break;
case 51:this.$ = new yy.Union($$[$0], true);
break;
case 52:this.$ = [$$[$0]];
break;
case 53:this.$ = $$[$0-1].concat($$[$0]);
break;
case 54:this.$ = new yy.Join($$[$0-2], $$[$0]);
break;
case 55:this.$ = new yy.Join($$[$0-2], $$[$0], 'LEFT', 'OUTER');
break;
case 56:this.$ = new yy.Join($$[$0-2], $$[$0], 'RIGHT', 'OUTER');
break;
case 57:this.$ = new yy.Join($$[$0-2], $$[$0], 'LEFT', 'INNER');
break;
case 58:this.$ = new yy.Join($$[$0-2], $$[$0], 'LEFT', 'INNER');
break;
case 59:this.$ = new yy.Join($$[$0-2], $$[$0], 'RIGHT', 'INNER');
break;
case 60:this.$ = new yy.Join($$[$0-2], $$[$0], 'LEFT', 'OUTER');
break;
case 61:this.$ = new yy.Join($$[$0-2], $$[$0], 'RIGHT', 'OUTER');
break;
case 62:this.$ = new yy.Join($$[$0], null, 'LEFT', 'INNER');
break;
case 63:this.$ = new yy.Where($$[$0]);
break;
case 64:this.$ = new yy.Limit(null, $$[$0]);
break;
case 65:this.$ = new yy.Limit($$[$0-2], $$[$0]);
break;
case 66:this.$ = new yy.Order($$[$0]);
break;
case 67:this.$ = [$$[$0]];
break;
case 68:this.$ = $$[$0-2].concat($$[$0]);
break;
case 69:this.$ = new yy.OrderArgument($$[$0], 'ASC');
break;
case 70:this.$ = new yy.OrderArgument($$[$0-1], $$[$0]);
break;
case 71:this.$ = new yy.OrderArgument($$[$0-2], 'ASC', 'NOCASE');
break;
case 72:this.$ = new yy.OrderArgument($$[$0-3], $$[$0], 'NOCASE');
break;
case 73:this.$ = $$[$0];
break;
case 74:this.$ = (function () {
                $$[$0-1].having = $$[$0];
                return $$[$0-1];
            }());
break;
case 75:this.$ = new yy.Group($$[$0]);
break;
case 76:this.$ = new yy.Having($$[$0]);
break;
case 77:this.$ = [$$[$0]];
break;
case 78:this.$ = $$[$0-1].concat($$[$0]);
break;
case 79:this.$ = new yy.FunctionValue('CASE_CONDITION', [$$[$0-2], $$[$0]]);
break;
case 80:this.$ = $$[$0];
break;
case 81:this.$ = $$[$0-1];
break;
case 82:this.$ = new yy.Op($$[$0-1], $$[$0-2], $$[$0]);
break;
case 83:this.$ = new yy.Op($$[$0-1], $$[$0-2], $$[$0]);
break;
case 84:this.$ = new yy.Op($$[$0-1], $$[$0-2], $$[$0]);
break;
case 85:this.$ = new yy.Op($$[$0-1], $$[$0-2], $$[$0]);
break;
case 86:this.$ = new yy.Op($$[$0-1], $$[$0-2], $$[$0]);
break;
case 87:this.$ = new yy.Op('NOT_IN', $$[$0-5], $$[$0-1]);
break;
case 88:this.$ = new yy.Op('NOT_IN', $$[$0-3], $$[$0]);
break;
case 89:this.$ = new yy.Op('IN', $$[$0-4], $$[$0-1]);
break;
case 90:this.$ = new yy.Op('IN', $$[$0-2], $$[$0]);
break;
case 91:this.$ = new yy.FunctionValue('CASE', [$$[$0-1], void 0, void 0]);
break;
case 92:this.$ = new yy.FunctionValue('CASE', [$$[$0-1], $$[$0-2], void 0]);
break;
case 93:this.$ = new yy.FunctionValue('CASE', [$$[$0-3], void 0, $$[$0-1]]);
break;
case 94:this.$ = new yy.FunctionValue('CASE', [$$[$0-3], $$[$0-4], $$[$0-1]]);
break;
case 95:this.$ = $$[$0];
break;
case 96:this.$ = $$[$0];
break;
case 97:this.$ = $$[$0];
break;
case 98:this.$ = $$[$0];
break;
case 99:this.$ = $$[$0];
break;
case 100:this.$ = $$[$0];
break;
case 101:this.$ = $$[$0];
break;
case 102:this.$ = $$[$0];
break;
case 103:this.$ = new yy.LiteralValue($$[$0]);
break;
case 104:this.$ = new yy.LiteralValue($$[$0-1]);
break;
case 105:this.$ = new yy.LiteralValue($$[$0-2], $$[$0]);
break;
case 106:this.$ = new yy.LiteralValue($$[$0]);
break;
case 107:this.$ = new yy.NumberValue($$[$0]);
break;
case 108:this.$ = new yy.NumberValue($$[$0], $$[$0-1]);
break;
case 109:this.$ = new yy.BooleanValue($$[$0]);
break;
case 110:this.$ = new yy.StringValue($$[$0], "'");
break;
case 111:this.$ = new yy.StringValue($$[$0], '"');
break;
case 112:this.$ = new yy.FunctionCastValue($$[$0-5], $$[$0-3], $$[$0-1], false);
break;
case 113:this.$ = new yy.FunctionValue($$[$0-3], [$$[$0-1]], false, false);
break;
case 114:this.$ = new yy.FunctionValue($$[$0-3], $$[$0-1], false, false);
break;
case 115:this.$ = new yy.FunctionValue($$[$0-4], [$$[$0-1]], false, true);
break;
case 116:this.$ = new yy.FunctionValue($$[$0-3], $$[$0-1], true);
break;
case 117:this.$ = (function () {
                var args, escFn, parser, placeholders, value;
                parser = yy.parser;
                args = parser.args;
                placeholders = parser.placeholders;
                escFn = parser.escFn;
                if (args.length !== placeholders.length) {
                    parser.throwUnMatchedParamsExc();
                }
                value = args.shift();
                placeholders.shift();
                value = escFn(value);
                if (value === null || value === undefined) {
                    return value;
                }
                switch (typeof value) {
                    case "string":
                        return new yy.StringValue(value, "'");
                    case "number":
                        return new yy.NumberValue(Math.abs(value), (value > -1 ? "+" : "-"));
                    default:
                        return String(value);
                }
            }());
break;
case 118:this.$ = [$$[$0]];
break;
case 119:this.$ = $$[$0-2].concat($$[$0]);
break;
case 120:this.$ = [$$[$0]];
break;
case 121:this.$ = $$[$0-2].concat($$[$0]);
break;
case 122:this.$ = [$$[$0]];
break;
case 123:this.$ = $$[$0-2].concat($$[$0]);
break;
case 124:this.$ = new yy.Star('');
break;
case 125:this.$ = new yy.Star($$[$0-2]);
break;
case 126:this.$ = new yy.Field($$[$0], $$[$0]);
break;
case 127:this.$ = new yy.Field($$[$0-2], $$[$0]);
break;
case 128:this.$ = new yy.Field($$[$0-2], $$[$0]);
break;
case 129:this.$ = [$$[$0]];
break;
case 130:this.$ = $$[$0-2].concat($$[$0]);
break;
case 131:this.$ = new yy.FieldDef($$[$0], 'text', true, false, false);
break;
case 132:this.$ = new yy.FieldDef($$[$0-1], $$[$0], true, false, false);
break;
case 133:this.$ = new yy.FieldDef($$[$0-2], $$[$0-1], false, false, false);
break;
case 134:this.$ = new yy.FieldDef($$[$0-4], $$[$0-3], false, true, false);
break;
case 135:this.$ = new yy.FieldDef($$[$0-5], $$[$0-4], false, true, true);
break;
case 136:this.$ = new yy.FieldDef($$[$0-3], $$[$0-2], true, true, false);
break;
case 137:this.$ = new yy.FieldDef($$[$0-4], $$[$0-3], true, true, true);
break;
}
},
table: [{3:1,4:2,6:3,7:4,8:[1,12],11:5,12:6,13:7,14:8,15:9,16:10,17:11,18:13,20:20,21:21,22:22,26:23,28:[1,24],34:[1,14],41:[1,15],42:[1,16],45:[1,17],49:[1,18],50:[1,19]},{1:[3]},{5:[1,25]},{5:[2,2]},{5:[2,3]},{5:[2,5]},{5:[2,6]},{5:[2,7]},{5:[2,8]},{5:[2,9]},{5:[2,10]},{5:[2,11]},{9:[1,26]},{5:[2,12],19:27,25:28,40:[2,12],58:29,59:[1,31],71:[1,30]},{35:[1,32]},{30:[1,33]},{36:34,103:[1,35],104:[1,36],107:[1,37]},{46:[1,38]},{46:[1,39]},{46:[1,40]},{5:[2,14],40:[2,14],59:[2,14],71:[2,14]},{5:[2,15],40:[2,15],59:[2,15],71:[2,15]},{5:[2,16],23:41,24:42,40:[2,16],59:[2,16],71:[2,16],72:[1,43],79:44,81:[1,45]},{5:[2,21],27:46,40:[2,21],59:[2,21],70:[1,47],71:[2,21],72:[2,21],81:[2,21]},{29:48,32:[1,49],36:52,38:[1,57],56:60,57:56,64:53,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],112:[1,51],113:[1,71],114:50},{1:[2,1]},{10:[1,72]},{5:[2,13],40:[2,13],58:73,59:[1,31]},{5:[2,20],40:[2,20],59:[2,20],71:[2,20]},{5:[2,48],40:[2,48],59:[2,48]},{36:75,38:[1,57],56:60,57:56,64:74,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],113:[1,71]},{18:76,20:20,21:21,22:22,26:23,28:[1,24],60:[1,77]},{36:78,103:[1,35],104:[1,36],107:[1,37]},{36:79,103:[1,35],104:[1,36],107:[1,37]},{43:[1,80],106:[1,81]},{5:[2,103],28:[2,103],30:[2,103],37:[2,103],38:[2,103],40:[2,103],43:[2,103],51:[2,103],53:[2,103],54:[2,103],59:[2,103],62:[2,103],63:[2,103],65:[2,103],66:[2,103],67:[2,103],69:[2,103],70:[2,103],71:[2,103],72:[2,103],81:[2,103],103:[2,103],104:[2,103],106:[2,103],107:[2,103],116:[2,103],117:[2,103]},{103:[1,82]},{5:[2,106],28:[2,106],30:[2,106],37:[2,106],38:[2,106],40:[2,106],43:[2,106],51:[2,106],53:[2,106],54:[2,106],59:[2,106],62:[2,106],63:[2,106],65:[2,106],66:[2,106],67:[2,106],69:[2,106],70:[2,106],71:[2,106],72:[2,106],81:[2,106],103:[2,106],104:[2,106],106:[2,106],107:[2,106],116:[2,106],117:[2,106]},{36:83,48:[1,84],103:[1,35],104:[1,36],107:[1,37]},{36:85,48:[1,86],103:[1,35],104:[1,36],107:[1,37]},{36:87,103:[1,35],104:[1,36],107:[1,37]},{5:[2,17],40:[2,17],59:[2,17],71:[2,17]},{5:[2,18],23:88,40:[2,18],59:[2,18],71:[2,18],72:[1,43]},{73:[1,89]},{5:[2,73],40:[2,73],59:[2,73],71:[2,73],72:[2,73],80:90,82:[1,91]},{73:[1,92]},{5:[2,22],40:[2,22],59:[2,22],71:[2,22],72:[2,22],81:[2,22]},{36:75,38:[1,57],56:60,57:56,64:93,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],113:[1,71]},{30:[1,94],69:[1,95]},{29:96,36:52,38:[1,57],56:60,57:56,64:53,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],112:[1,51],113:[1,71],114:50},{30:[2,122],40:[2,122],69:[2,122]},{30:[2,124],40:[2,124],69:[2,124]},{30:[2,96],40:[2,96],53:[2,96],69:[2,96],87:[2,96],88:[2,96],89:[2,96],90:[2,96],91:[2,96],92:[1,98],93:[1,99],106:[1,97]},{30:[2,126],40:[2,126],53:[1,100],69:[2,126],87:[1,101],88:[1,102],89:[1,103],90:[1,104],91:[1,105]},{5:[2,103],30:[2,103],38:[1,106],40:[2,103],53:[2,103],59:[2,103],62:[2,103],65:[2,103],66:[2,103],67:[2,103],69:[2,103],70:[2,103],71:[2,103],72:[2,103],76:[2,103],77:[2,103],81:[2,103],82:[2,103],85:[2,103],86:[2,103],87:[2,103],88:[2,103],89:[2,103],90:[2,103],91:[2,103],92:[2,103],93:[2,103],95:[2,103],96:[2,103],106:[2,103]},{5:[2,106],30:[2,106],38:[1,107],40:[2,106],53:[2,106],59:[2,106],62:[2,106],65:[2,106],66:[2,106],67:[2,106],69:[2,106],70:[2,106],71:[2,106],72:[2,106],76:[2,106],77:[2,106],81:[2,106],82:[2,106],85:[2,106],86:[2,106],87:[2,106],88:[2,106],89:[2,106],90:[2,106],91:[2,106],92:[2,106],93:[2,106],95:[2,106],96:[2,106],106:[2,106]},{5:[2,80],30:[2,80],40:[2,80],53:[2,80],59:[2,80],62:[2,80],65:[2,80],66:[2,80],67:[2,80],69:[2,80],70:[2,80],71:[2,80],72:[2,80],76:[2,80],77:[2,80],81:[2,80],82:[2,80],85:[2,80],86:[2,80],87:[2,80],88:[2,80],89:[2,80],90:[2,80],91:[2,80],95:[2,80],96:[2,80]},{11:109,18:13,20:20,21:21,22:22,26:23,28:[1,24],36:75,38:[1,57],56:60,57:56,64:108,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],113:[1,71]},{36:75,38:[1,57],56:60,57:56,64:111,83:110,84:112,85:[1,113],88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],113:[1,71]},{5:[2,95],30:[2,95],40:[2,95],53:[2,95],59:[2,95],62:[2,95],65:[2,95],66:[2,95],67:[2,95],69:[2,95],70:[2,95],71:[2,95],72:[2,95],76:[2,95],77:[2,95],81:[2,95],82:[2,95],85:[2,95],86:[2,95],87:[2,95],88:[2,95],89:[2,95],90:[2,95],91:[2,95],95:[2,95],96:[2,95]},{5:[2,97],30:[2,97],40:[2,97],53:[2,97],59:[2,97],62:[2,97],65:[2,97],66:[2,97],67:[2,97],69:[2,97],70:[2,97],71:[2,97],72:[2,97],76:[2,97],77:[2,97],81:[2,97],82:[2,97],85:[2,97],86:[2,97],87:[2,97],88:[2,97],89:[2,97],90:[2,97],91:[2,97],95:[2,97],96:[2,97]},{5:[2,98],30:[2,98],40:[2,98],53:[2,98],59:[2,98],62:[2,98],65:[2,98],66:[2,98],67:[2,98],69:[2,98],70:[2,98],71:[2,98],72:[2,98],76:[2,98],77:[2,98],81:[2,98],82:[2,98],85:[2,98],86:[2,98],87:[2,98],88:[2,98],89:[2,98],90:[2,98],91:[2,98],95:[2,98],96:[2,98]},{5:[2,99],30:[2,99],40:[2,99],53:[2,99],59:[2,99],62:[2,99],65:[2,99],66:[2,99],67:[2,99],69:[2,99],70:[2,99],71:[2,99],72:[2,99],76:[2,99],77:[2,99],81:[2,99],82:[2,99],85:[2,99],86:[2,99],87:[2,99],88:[2,99],89:[2,99],90:[2,99],91:[2,99],95:[2,99],96:[2,99]},{5:[2,100],30:[2,100],40:[2,100],53:[2,100],59:[2,100],62:[2,100],65:[2,100],66:[2,100],67:[2,100],69:[2,100],70:[2,100],71:[2,100],72:[2,100],76:[2,100],77:[2,100],81:[2,100],82:[2,100],85:[2,100],86:[2,100],87:[2,100],88:[2,100],89:[2,100],90:[2,100],91:[2,100],95:[2,100],96:[2,100]},{5:[2,101],30:[2,101],40:[2,101],53:[2,101],59:[2,101],62:[2,101],65:[2,101],66:[2,101],67:[2,101],69:[2,101],70:[2,101],71:[2,101],72:[2,101],76:[2,101],77:[2,101],81:[2,101],82:[2,101],85:[2,101],86:[2,101],87:[2,101],88:[2,101],89:[2,101],90:[2,101],91:[2,101],95:[2,101],96:[2,101]},{5:[2,102],30:[2,102],40:[2,102],53:[2,102],59:[2,102],62:[2,102],65:[2,102],66:[2,102],67:[2,102],69:[2,102],70:[2,102],71:[2,102],72:[2,102],76:[2,102],77:[2,102],81:[2,102],82:[2,102],85:[2,102],86:[2,102],87:[2,102],88:[2,102],89:[2,102],90:[2,102],91:[2,102],95:[2,102],96:[2,102]},{5:[2,107],30:[2,107],40:[2,107],53:[2,107],59:[2,107],62:[2,107],65:[2,107],66:[2,107],67:[2,107],69:[2,107],70:[2,107],71:[2,107],72:[2,107],76:[2,107],77:[2,107],81:[2,107],82:[2,107],85:[2,107],86:[2,107],87:[2,107],88:[2,107],89:[2,107],90:[2,107],91:[2,107],95:[2,107],96:[2,107]},{108:[1,114]},{5:[2,109],30:[2,109],40:[2,109],53:[2,109],59:[2,109],62:[2,109],65:[2,109],66:[2,109],67:[2,109],69:[2,109],70:[2,109],71:[2,109],72:[2,109],76:[2,109],77:[2,109],81:[2,109],82:[2,109],85:[2,109],86:[2,109],87:[2,109],88:[2,109],89:[2,109],90:[2,109],91:[2,109],95:[2,109],96:[2,109]},{5:[2,110],30:[2,110],40:[2,110],53:[2,110],59:[2,110],62:[2,110],65:[2,110],66:[2,110],67:[2,110],69:[2,110],70:[2,110],71:[2,110],72:[2,110],76:[2,110],77:[2,110],81:[2,110],82:[2,110],85:[2,110],86:[2,110],87:[2,110],88:[2,110],89:[2,110],90:[2,110],91:[2,110],95:[2,110],96:[2,110]},{5:[2,111],30:[2,111],40:[2,111],53:[2,111],59:[2,111],62:[2,111],65:[2,111],66:[2,111],67:[2,111],69:[2,111],70:[2,111],71:[2,111],72:[2,111],76:[2,111],77:[2,111],81:[2,111],82:[2,111],85:[2,111],86:[2,111],87:[2,111],88:[2,111],89:[2,111],90:[2,111],91:[2,111],95:[2,111],96:[2,111]},{5:[2,117],30:[2,117],40:[2,117],53:[2,117],59:[2,117],62:[2,117],65:[2,117],66:[2,117],67:[2,117],69:[2,117],70:[2,117],71:[2,117],72:[2,117],76:[2,117],77:[2,117],81:[2,117],82:[2,117],85:[2,117],86:[2,117],87:[2,117],88:[2,117],89:[2,117],90:[2,117],91:[2,117],95:[2,117],96:[2,117]},{11:115,18:13,20:20,21:21,22:22,26:23,28:[1,24]},{5:[2,49],40:[2,49],59:[2,49]},{5:[2,64],40:[2,64],59:[2,64],69:[1,116],71:[2,64],87:[1,101],88:[1,102],89:[1,103],90:[1,104],91:[1,105]},{5:[2,96],30:[2,96],40:[2,96],53:[2,96],59:[2,96],62:[2,96],65:[2,96],66:[2,96],67:[2,96],69:[2,96],70:[2,96],71:[2,96],72:[2,96],76:[2,96],77:[2,96],81:[2,96],82:[2,96],85:[2,96],86:[2,96],87:[2,96],88:[2,96],89:[2,96],90:[2,96],91:[2,96],92:[1,98],93:[1,99],95:[2,96],96:[2,96],106:[1,81]},{5:[2,50],25:28,40:[2,50],59:[2,50],71:[1,30]},{18:117,20:20,21:21,22:22,26:23,28:[1,24]},{18:119,20:20,21:21,22:22,26:23,28:[1,24],37:[1,118],38:[1,120],106:[1,81]},{5:[2,31],27:121,70:[1,47],106:[1,81]},{36:75,38:[1,57],44:122,56:60,57:56,64:123,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],113:[1,71]},{103:[1,124]},{105:[1,125]},{38:[1,126],106:[1,81]},{36:127,103:[1,35],104:[1,36],107:[1,37]},{5:[2,37],106:[1,81]},{36:128,103:[1,35],104:[1,36],107:[1,37]},{51:[1,129],106:[1,81]},{5:[2,19],40:[2,19],59:[2,19],71:[2,19]},{36:75,38:[1,57],56:60,57:56,64:132,74:130,75:131,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],113:[1,71]},{5:[2,74],40:[2,74],59:[2,74],71:[2,74],72:[2,74]},{36:75,38:[1,57],56:60,57:56,64:133,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],113:[1,71]},{36:75,38:[1,57],39:134,56:60,57:56,64:135,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],113:[1,71]},{5:[2,63],40:[2,63],59:[2,63],71:[2,63],72:[2,63],81:[2,63],87:[1,101],88:[1,102],89:[1,103],90:[1,104],91:[1,105]},{31:136,36:137,38:[1,138],103:[1,35],104:[1,36],107:[1,37]},{36:52,38:[1,57],56:60,57:56,64:53,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],112:[1,51],113:[1,71],114:139},{30:[1,140],69:[1,95]},{103:[1,124],112:[1,141]},{93:[1,142]},{38:[1,143],57:144},{36:145,99:146,103:[1,35],104:[1,36],107:[1,37],110:[1,69],111:[1,70]},{36:75,38:[1,57],56:60,57:56,64:147,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],113:[1,71]},{36:75,38:[1,57],56:60,57:56,64:148,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],113:[1,71]},{36:75,38:[1,57],56:60,57:56,64:149,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],113:[1,71]},{36:75,38:[1,57],56:60,57:56,64:150,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],113:[1,71]},{36:75,38:[1,57],56:60,57:56,64:151,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],113:[1,71]},{36:75,38:[1,57],39:152,56:60,57:56,64:135,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],113:[1,71]},{32:[1,156],36:75,38:[1,57],39:155,56:60,57:56,64:153,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],112:[1,154],113:[1,71]},{40:[1,157],87:[1,101],88:[1,102],89:[1,103],90:[1,104],91:[1,105]},{40:[1,158]},{84:161,85:[1,113],95:[1,159],96:[1,160]},{83:162,84:112,85:[1,113],87:[1,101],88:[1,102],89:[1,103],90:[1,104],91:[1,105]},{85:[2,77],95:[2,77],96:[2,77]},{36:75,38:[1,57],56:60,57:56,64:163,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],113:[1,71]},{5:[2,108],30:[2,108],40:[2,108],53:[2,108],59:[2,108],62:[2,108],65:[2,108],66:[2,108],67:[2,108],69:[2,108],70:[2,108],71:[2,108],72:[2,108],76:[2,108],77:[2,108],81:[2,108],82:[2,108],85:[2,108],86:[2,108],87:[2,108],88:[2,108],89:[2,108],90:[2,108],91:[2,108],95:[2,108],96:[2,108]},{5:[2,4]},{36:75,38:[1,57],56:60,57:56,64:164,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],113:[1,71]},{5:[2,51],25:28,40:[2,51],59:[2,51],71:[1,30]},{38:[1,165]},{5:[2,28],25:28,71:[1,30]},{29:166,36:52,38:[1,57],56:60,57:56,64:53,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],112:[1,51],113:[1,71],114:50},{5:[2,32]},{5:[2,33],27:167,69:[1,168],70:[1,47]},{5:[2,120],69:[2,120],70:[2,120],87:[1,101],88:[1,102],89:[1,103],90:[1,104],91:[1,105]},{5:[2,105],28:[2,105],30:[2,105],37:[2,105],38:[2,105],40:[2,105],43:[2,105],51:[2,105],53:[2,105],54:[2,105],59:[2,105],62:[2,105],63:[2,105],65:[2,105],66:[2,105],67:[2,105],69:[2,105],70:[2,105],71:[2,105],72:[2,105],76:[2,105],77:[2,105],81:[2,105],82:[2,105],85:[2,105],86:[2,105],87:[2,105],88:[2,105],89:[2,105],90:[2,105],91:[2,105],92:[2,105],93:[2,105],95:[2,105],96:[2,105],103:[2,105],104:[2,105],106:[2,105],107:[2,105],116:[2,105],117:[2,105]},{5:[2,104],28:[2,104],30:[2,104],37:[2,104],38:[2,104],40:[2,104],43:[2,104],51:[2,104],53:[2,104],54:[2,104],59:[2,104],62:[2,104],63:[2,104],65:[2,104],66:[2,104],67:[2,104],69:[2,104],70:[2,104],71:[2,104],72:[2,104],76:[2,104],77:[2,104],81:[2,104],82:[2,104],85:[2,104],86:[2,104],87:[2,104],88:[2,104],89:[2,104],90:[2,104],91:[2,104],92:[2,104],93:[2,104],95:[2,104],96:[2,104],103:[2,104],104:[2,104],106:[2,104],107:[2,104],116:[2,104],117:[2,104]},{36:171,47:169,103:[1,35],104:[1,36],107:[1,37],115:170},{38:[1,172],106:[1,81]},{5:[2,38],106:[1,81]},{52:[1,173]},{5:[2,66],40:[2,66],59:[2,66],69:[1,174],71:[2,66]},{5:[2,67],40:[2,67],59:[2,67],69:[2,67],71:[2,67]},{5:[2,69],40:[2,69],59:[2,69],69:[2,69],71:[2,69],76:[1,175],77:[1,176],87:[1,101],88:[1,102],89:[1,103],90:[1,104],91:[1,105]},{5:[2,76],40:[2,76],59:[2,76],71:[2,76],72:[2,76],87:[1,101],88:[1,102],89:[1,103],90:[1,104],91:[1,105]},{5:[2,75],40:[2,75],59:[2,75],69:[1,177],71:[2,75],72:[2,75],82:[2,75]},{5:[2,118],40:[2,118],59:[2,118],69:[2,118],71:[2,118],72:[2,118],82:[2,118],87:[1,101],88:[1,102],89:[1,103],90:[1,104],91:[1,105]},{5:[2,23],33:178,40:[2,23],59:[2,23],61:179,62:[1,180],65:[1,181],66:[1,182],67:[1,183],69:[1,184],70:[2,23],71:[2,23],72:[2,23],81:[2,23]},{5:[2,40],36:186,40:[2,40],53:[1,185],54:[1,187],59:[2,40],62:[2,40],63:[2,40],65:[2,40],66:[2,40],67:[2,40],69:[2,40],70:[2,40],71:[2,40],72:[2,40],81:[2,40],103:[1,35],104:[1,36],106:[1,81],107:[1,37]},{11:188,18:13,20:20,21:21,22:22,26:23,28:[1,24]},{30:[2,123],40:[2,123],69:[2,123]},{31:189,36:137,38:[1,138],103:[1,35],104:[1,36],107:[1,37]},{30:[2,125],40:[2,125],69:[2,125]},{38:[1,190],57:191},{11:109,18:13,20:20,21:21,22:22,26:23,28:[1,24],36:75,38:[1,57],39:192,56:60,57:56,64:135,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],113:[1,71]},{5:[2,90],30:[2,90],40:[2,90],53:[2,90],59:[2,90],62:[2,90],65:[2,90],66:[2,90],67:[2,90],69:[2,90],70:[2,90],71:[2,90],72:[2,90],76:[2,90],77:[2,90],81:[2,90],82:[2,90],85:[2,90],86:[2,90],87:[2,90],88:[2,90],89:[2,90],90:[2,90],91:[2,90],95:[2,90],96:[2,90]},{30:[2,127],40:[2,127],69:[2,127],106:[1,81]},{30:[2,128],40:[2,128],69:[2,128]},{5:[2,82],30:[2,82],40:[2,82],53:[2,82],59:[2,82],62:[2,82],65:[2,82],66:[2,82],67:[2,82],69:[2,82],70:[2,82],71:[2,82],72:[2,82],76:[2,82],77:[2,82],81:[2,82],82:[2,82],85:[2,82],86:[2,82],87:[2,82],88:[1,102],89:[1,103],90:[2,82],91:[2,82],95:[2,82],96:[2,82]},{5:[2,83],30:[2,83],40:[2,83],53:[2,83],59:[2,83],62:[2,83],65:[2,83],66:[2,83],67:[2,83],69:[2,83],70:[2,83],71:[2,83],72:[2,83],76:[2,83],77:[2,83],81:[2,83],82:[2,83],85:[2,83],86:[2,83],87:[2,83],88:[2,83],89:[1,103],90:[2,83],91:[2,83],95:[2,83],96:[2,83]},{5:[2,84],30:[2,84],40:[2,84],53:[2,84],59:[2,84],62:[2,84],65:[2,84],66:[2,84],67:[2,84],69:[2,84],70:[2,84],71:[2,84],72:[2,84],76:[2,84],77:[2,84],81:[2,84],82:[2,84],85:[2,84],86:[2,84],87:[2,84],88:[2,84],89:[2,84],90:[2,84],91:[2,84],95:[2,84],96:[2,84]},{5:[2,85],30:[2,85],40:[2,85],53:[2,85],59:[2,85],62:[2,85],65:[2,85],66:[2,85],67:[2,85],69:[2,85],70:[2,85],71:[2,85],72:[2,85],76:[2,85],77:[2,85],81:[2,85],82:[2,85],85:[2,85],86:[2,85],87:[1,101],88:[1,102],89:[1,103],90:[2,85],91:[2,85],95:[2,85],96:[2,85]},{5:[2,86],30:[2,86],40:[2,86],53:[2,86],59:[2,86],62:[2,86],65:[2,86],66:[2,86],67:[2,86],69:[2,86],70:[2,86],71:[2,86],72:[2,86],76:[2,86],77:[2,86],81:[2,86],82:[2,86],85:[2,86],86:[2,86],87:[1,101],88:[1,102],89:[1,103],90:[1,104],91:[2,86],95:[2,86],96:[2,86]},{40:[1,193],69:[1,177]},{40:[2,118],53:[1,194],69:[2,118],87:[1,101],88:[1,102],89:[1,103],90:[1,104],91:[1,105]},{40:[1,195]},{40:[1,196],69:[1,177]},{36:75,38:[1,57],56:60,57:56,64:197,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],113:[1,71]},{5:[2,81],30:[2,81],40:[2,81],53:[2,81],59:[2,81],62:[2,81],65:[2,81],66:[2,81],67:[2,81],69:[2,81],70:[2,81],71:[2,81],72:[2,81],76:[2,81],77:[2,81],81:[2,81],82:[2,81],85:[2,81],86:[2,81],87:[2,81],88:[2,81],89:[2,81],90:[2,81],91:[2,81],95:[2,81],96:[2,81]},{5:[2,47],30:[2,47],40:[2,47],53:[2,47],59:[2,47],62:[2,47],65:[2,47],66:[2,47],67:[2,47],69:[2,47],70:[2,47],71:[2,47],72:[2,47],76:[2,47],77:[2,47],81:[2,47],82:[2,47],85:[2,47],86:[2,47],87:[2,47],88:[2,47],89:[2,47],90:[2,47],91:[2,47],95:[2,47],96:[2,47]},{5:[2,91],30:[2,91],40:[2,91],53:[2,91],59:[2,91],62:[2,91],65:[2,91],66:[2,91],67:[2,91],69:[2,91],70:[2,91],71:[2,91],72:[2,91],76:[2,91],77:[2,91],81:[2,91],82:[2,91],85:[2,91],86:[2,91],87:[2,91],88:[2,91],89:[2,91],90:[2,91],91:[2,91],95:[2,91],96:[2,91]},{36:75,38:[1,57],56:60,57:56,64:198,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],113:[1,71]},{85:[2,78],95:[2,78],96:[2,78]},{84:161,85:[1,113],95:[1,199],96:[1,200]},{86:[1,201],87:[1,101],88:[1,102],89:[1,103],90:[1,104],91:[1,105]},{5:[2,65],40:[2,65],59:[2,65],71:[2,65],87:[1,101],88:[1,102],89:[1,103],90:[1,104],91:[1,105]},{36:75,38:[1,57],39:202,56:60,57:56,64:135,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],113:[1,71]},{40:[1,203],69:[1,95]},{5:[2,34]},{36:75,38:[1,57],56:60,57:56,64:204,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],113:[1,71]},{40:[1,205],69:[1,206]},{40:[2,129],69:[2,129]},{36:207,40:[2,131],69:[2,131],103:[1,35],104:[1,36],106:[1,81],107:[1,37]},{36:171,47:208,103:[1,35],104:[1,36],107:[1,37],115:170},{36:209,103:[1,35],104:[1,36],107:[1,37]},{36:75,38:[1,57],56:60,57:56,64:132,75:210,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],113:[1,71]},{5:[2,70],40:[2,70],59:[2,70],69:[2,70],71:[2,70]},{78:[1,211]},{36:75,38:[1,57],56:60,57:56,64:212,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],113:[1,71]},{5:[2,25],40:[2,25],59:[2,25],61:213,62:[1,180],65:[1,181],66:[1,182],67:[1,183],69:[1,184],70:[2,25],71:[2,25],72:[2,25],81:[2,25]},{5:[2,52],40:[2,52],59:[2,52],62:[2,52],65:[2,52],66:[2,52],67:[2,52],69:[2,52],70:[2,52],71:[2,52],72:[2,52],81:[2,52]},{31:214,36:137,38:[1,138],103:[1,35],104:[1,36],107:[1,37]},{62:[1,215],67:[1,216],68:[1,217]},{62:[1,218],67:[1,219],68:[1,220]},{62:[1,221]},{31:222,36:137,38:[1,138],103:[1,35],104:[1,36],107:[1,37]},{36:223,103:[1,35],104:[1,36],107:[1,37]},{5:[2,42],40:[2,42],59:[2,42],62:[2,42],63:[2,42],65:[2,42],66:[2,42],67:[2,42],69:[2,42],70:[2,42],71:[2,42],72:[2,42],81:[2,42],106:[1,81]},{55:[1,224]},{40:[1,225]},{5:[2,24],33:226,40:[2,24],59:[2,24],61:179,62:[1,180],65:[1,181],66:[1,182],67:[1,183],69:[1,184],70:[2,24],71:[2,24],72:[2,24],81:[2,24]},{11:109,18:13,20:20,21:21,22:22,26:23,28:[1,24],36:75,38:[1,57],39:227,56:60,57:56,64:135,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],113:[1,71]},{5:[2,88],30:[2,88],40:[2,88],53:[2,88],59:[2,88],62:[2,88],65:[2,88],66:[2,88],67:[2,88],69:[2,88],70:[2,88],71:[2,88],72:[2,88],76:[2,88],77:[2,88],81:[2,88],82:[2,88],85:[2,88],86:[2,88],87:[2,88],88:[2,88],89:[2,88],90:[2,88],91:[2,88],95:[2,88],96:[2,88]},{40:[1,228],69:[1,177]},{5:[2,116],30:[2,116],40:[2,116],53:[2,116],59:[2,116],62:[2,116],65:[2,116],66:[2,116],67:[2,116],69:[2,116],70:[2,116],71:[2,116],72:[2,116],76:[2,116],77:[2,116],81:[2,116],82:[2,116],85:[2,116],86:[2,116],87:[2,116],88:[2,116],89:[2,116],90:[2,116],91:[2,116],95:[2,116],96:[2,116]},{36:229,103:[1,35],104:[1,36],107:[1,37]},{5:[2,113],30:[2,113],40:[2,113],53:[2,113],59:[2,113],62:[2,113],65:[2,113],66:[2,113],67:[2,113],69:[2,113],70:[2,113],71:[2,113],72:[2,113],76:[2,113],77:[2,113],81:[2,113],82:[2,113],85:[2,113],86:[2,113],87:[2,113],88:[2,113],89:[2,113],90:[2,113],91:[2,113],95:[2,113],96:[2,113]},{5:[2,114],30:[2,114],40:[2,114],53:[2,114],59:[2,114],62:[2,114],65:[2,114],66:[2,114],67:[2,114],69:[2,114],70:[2,114],71:[2,114],72:[2,114],76:[2,114],77:[2,114],81:[2,114],82:[2,114],85:[2,114],86:[2,114],87:[2,114],88:[2,114],89:[2,114],90:[2,114],91:[2,114],95:[2,114],96:[2,114]},{40:[1,230],87:[1,101],88:[1,102],89:[1,103],90:[1,104],91:[1,105]},{87:[1,101],88:[1,102],89:[1,103],90:[1,104],91:[1,105],95:[1,231]},{5:[2,92],30:[2,92],40:[2,92],53:[2,92],59:[2,92],62:[2,92],65:[2,92],66:[2,92],67:[2,92],69:[2,92],70:[2,92],71:[2,92],72:[2,92],76:[2,92],77:[2,92],81:[2,92],82:[2,92],85:[2,92],86:[2,92],87:[2,92],88:[2,92],89:[2,92],90:[2,92],91:[2,92],95:[2,92],96:[2,92]},{36:75,38:[1,57],56:60,57:56,64:232,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],113:[1,71]},{36:75,38:[1,57],56:60,57:56,64:233,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],113:[1,71]},{40:[1,234],69:[1,177]},{18:236,20:20,21:21,22:22,26:23,28:[1,24],37:[1,235]},{5:[2,121],69:[2,121],70:[2,121],87:[1,101],88:[1,102],89:[1,103],90:[1,104],91:[1,105]},{5:[2,35]},{36:171,103:[1,35],104:[1,36],107:[1,37],115:237},{40:[2,132],69:[2,132],106:[1,81],116:[1,238],117:[1,239]},{40:[1,240],69:[1,206]},{5:[2,39],106:[1,81]},{5:[2,68],40:[2,68],59:[2,68],69:[2,68],71:[2,68]},{5:[2,71],40:[2,71],59:[2,71],69:[2,71],71:[2,71],76:[1,241]},{5:[2,119],40:[2,119],59:[2,119],69:[2,119],71:[2,119],72:[2,119],82:[2,119],87:[1,101],88:[1,102],89:[1,103],90:[1,104],91:[1,105]},{5:[2,53],40:[2,53],59:[2,53],62:[2,53],65:[2,53],66:[2,53],67:[2,53],69:[2,53],70:[2,53],71:[2,53],72:[2,53],81:[2,53]},{63:[1,242]},{31:243,36:137,38:[1,138],103:[1,35],104:[1,36],107:[1,37]},{62:[1,244]},{62:[1,245]},{31:246,36:137,38:[1,138],103:[1,35],104:[1,36],107:[1,37]},{62:[1,247]},{62:[1,248]},{31:249,36:137,38:[1,138],103:[1,35],104:[1,36],107:[1,37]},{5:[2,62],40:[2,62],59:[2,62],62:[2,62],65:[2,62],66:[2,62],67:[2,62],69:[2,62],70:[2,62],71:[2,62],72:[2,62],81:[2,62]},{5:[2,41],40:[2,41],59:[2,41],62:[2,41],63:[2,41],65:[2,41],66:[2,41],67:[2,41],69:[2,41],70:[2,41],71:[2,41],72:[2,41],81:[2,41],106:[1,81]},{38:[1,250]},{5:[2,43],36:251,40:[2,43],53:[1,252],59:[2,43],62:[2,43],63:[2,43],65:[2,43],66:[2,43],67:[2,43],69:[2,43],70:[2,43],71:[2,43],72:[2,43],81:[2,43],103:[1,35],104:[1,36],107:[1,37]},{5:[2,26],40:[2,26],59:[2,26],61:213,62:[1,180],65:[1,181],66:[1,182],67:[1,183],69:[1,184],70:[2,26],71:[2,26],72:[2,26],81:[2,26]},{40:[1,253],69:[1,177]},{5:[2,89],30:[2,89],40:[2,89],53:[2,89],59:[2,89],62:[2,89],65:[2,89],66:[2,89],67:[2,89],69:[2,89],70:[2,89],71:[2,89],72:[2,89],76:[2,89],77:[2,89],81:[2,89],82:[2,89],85:[2,89],86:[2,89],87:[2,89],88:[2,89],89:[2,89],90:[2,89],91:[2,89],95:[2,89],96:[2,89]},{40:[1,254],106:[1,81]},{5:[2,115],30:[2,115],40:[2,115],53:[2,115],59:[2,115],62:[2,115],65:[2,115],66:[2,115],67:[2,115],69:[2,115],70:[2,115],71:[2,115],72:[2,115],76:[2,115],77:[2,115],81:[2,115],82:[2,115],85:[2,115],86:[2,115],87:[2,115],88:[2,115],89:[2,115],90:[2,115],91:[2,115],95:[2,115],96:[2,115]},{5:[2,93],30:[2,93],40:[2,93],53:[2,93],59:[2,93],62:[2,93],65:[2,93],66:[2,93],67:[2,93],69:[2,93],70:[2,93],71:[2,93],72:[2,93],76:[2,93],77:[2,93],81:[2,93],82:[2,93],85:[2,93],86:[2,93],87:[2,93],88:[2,93],89:[2,93],90:[2,93],91:[2,93],95:[2,93],96:[2,93]},{87:[1,101],88:[1,102],89:[1,103],90:[1,104],91:[1,105],95:[1,255]},{85:[2,79],87:[1,101],88:[1,102],89:[1,103],90:[1,104],91:[1,105],95:[2,79],96:[2,79]},{5:[2,27]},{38:[1,256]},{5:[2,30],25:28,71:[1,30]},{40:[2,130],69:[2,130]},{40:[2,133],69:[2,133],117:[1,257]},{118:[1,258]},{5:[2,36]},{5:[2,72],40:[2,72],59:[2,72],69:[2,72],71:[2,72]},{36:75,38:[1,57],56:60,57:56,64:259,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],113:[1,71]},{63:[1,260]},{31:261,36:137,38:[1,138],103:[1,35],104:[1,36],107:[1,37]},{31:262,36:137,38:[1,138],103:[1,35],104:[1,36],107:[1,37]},{63:[1,263]},{31:264,36:137,38:[1,138],103:[1,35],104:[1,36],107:[1,37]},{31:265,36:137,38:[1,138],103:[1,35],104:[1,36],107:[1,37]},{63:[1,266]},{56:267,88:[1,67],108:[1,66]},{5:[2,44],40:[2,44],59:[2,44],62:[2,44],63:[2,44],65:[2,44],66:[2,44],67:[2,44],69:[2,44],70:[2,44],71:[2,44],72:[2,44],81:[2,44],106:[1,81]},{36:268,103:[1,35],104:[1,36],107:[1,37]},{5:[2,87],30:[2,87],40:[2,87],53:[2,87],59:[2,87],62:[2,87],65:[2,87],66:[2,87],67:[2,87],69:[2,87],70:[2,87],71:[2,87],72:[2,87],76:[2,87],77:[2,87],81:[2,87],82:[2,87],85:[2,87],86:[2,87],87:[2,87],88:[2,87],89:[2,87],90:[2,87],91:[2,87],95:[2,87],96:[2,87]},{5:[2,112],30:[2,112],40:[2,112],53:[2,112],59:[2,112],62:[2,112],65:[2,112],66:[2,112],67:[2,112],69:[2,112],70:[2,112],71:[2,112],72:[2,112],76:[2,112],77:[2,112],81:[2,112],82:[2,112],85:[2,112],86:[2,112],87:[2,112],88:[2,112],89:[2,112],90:[2,112],91:[2,112],95:[2,112],96:[2,112]},{5:[2,94],30:[2,94],40:[2,94],53:[2,94],59:[2,94],62:[2,94],65:[2,94],66:[2,94],67:[2,94],69:[2,94],70:[2,94],71:[2,94],72:[2,94],76:[2,94],77:[2,94],81:[2,94],82:[2,94],85:[2,94],86:[2,94],87:[2,94],88:[2,94],89:[2,94],90:[2,94],91:[2,94],95:[2,94],96:[2,94]},{36:75,38:[1,57],39:269,56:60,57:56,64:135,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],113:[1,71]},{118:[1,270]},{40:[2,136],69:[2,136],119:[1,271]},{5:[2,54],40:[2,54],59:[2,54],62:[2,54],65:[2,54],66:[2,54],67:[2,54],69:[2,54],70:[2,54],71:[2,54],72:[2,54],81:[2,54],87:[1,101],88:[1,102],89:[1,103],90:[1,104],91:[1,105]},{36:75,38:[1,57],56:60,57:56,64:272,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],113:[1,71]},{63:[1,273]},{63:[1,274]},{36:75,38:[1,57],56:60,57:56,64:275,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],113:[1,71]},{63:[1,276]},{63:[1,277]},{36:75,38:[1,57],56:60,57:56,64:278,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],113:[1,71]},{40:[1,279]},{5:[2,45],40:[2,45],59:[2,45],62:[2,45],63:[2,45],65:[2,45],66:[2,45],67:[2,45],69:[2,45],70:[2,45],71:[2,45],72:[2,45],81:[2,45],106:[1,81]},{40:[1,280],69:[1,177]},{40:[2,134],69:[2,134],119:[1,281]},{40:[2,137],69:[2,137]},{5:[2,55],40:[2,55],59:[2,55],62:[2,55],65:[2,55],66:[2,55],67:[2,55],69:[2,55],70:[2,55],71:[2,55],72:[2,55],81:[2,55],87:[1,101],88:[1,102],89:[1,103],90:[1,104],91:[1,105]},{36:75,38:[1,57],56:60,57:56,64:282,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],113:[1,71]},{36:75,38:[1,57],56:60,57:56,64:283,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],113:[1,71]},{5:[2,56],40:[2,56],59:[2,56],62:[2,56],65:[2,56],66:[2,56],67:[2,56],69:[2,56],70:[2,56],71:[2,56],72:[2,56],81:[2,56],87:[1,101],88:[1,102],89:[1,103],90:[1,104],91:[1,105]},{36:75,38:[1,57],56:60,57:56,64:284,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],113:[1,71]},{36:75,38:[1,57],56:60,57:56,64:285,88:[1,67],94:[1,58],97:59,98:61,99:62,100:63,101:64,102:65,103:[1,54],104:[1,36],107:[1,55],108:[1,66],109:[1,68],110:[1,69],111:[1,70],113:[1,71]},{5:[2,58],40:[2,58],59:[2,58],62:[2,58],65:[2,58],66:[2,58],67:[2,58],69:[2,58],70:[2,58],71:[2,58],72:[2,58],81:[2,58],87:[1,101],88:[1,102],89:[1,103],90:[1,104],91:[1,105]},{5:[2,46],40:[2,46],59:[2,46],62:[2,46],63:[2,46],65:[2,46],66:[2,46],67:[2,46],69:[2,46],70:[2,46],71:[2,46],72:[2,46],81:[2,46]},{5:[2,29]},{40:[2,135],69:[2,135]},{5:[2,57],40:[2,57],59:[2,57],62:[2,57],65:[2,57],66:[2,57],67:[2,57],69:[2,57],70:[2,57],71:[2,57],72:[2,57],81:[2,57],87:[1,101],88:[1,102],89:[1,103],90:[1,104],91:[1,105]},{5:[2,60],40:[2,60],59:[2,60],62:[2,60],65:[2,60],66:[2,60],67:[2,60],69:[2,60],70:[2,60],71:[2,60],72:[2,60],81:[2,60],87:[1,101],88:[1,102],89:[1,103],90:[1,104],91:[1,105]},{5:[2,59],40:[2,59],59:[2,59],62:[2,59],65:[2,59],66:[2,59],67:[2,59],69:[2,59],70:[2,59],71:[2,59],72:[2,59],81:[2,59],87:[1,101],88:[1,102],89:[1,103],90:[1,104],91:[1,105]},{5:[2,61],40:[2,61],59:[2,61],62:[2,61],65:[2,61],66:[2,61],67:[2,61],69:[2,61],70:[2,61],71:[2,61],72:[2,61],81:[2,61],87:[1,101],88:[1,102],89:[1,103],90:[1,104],91:[1,105]}],
defaultActions: {3:[2,2],4:[2,3],5:[2,5],6:[2,6],7:[2,7],8:[2,8],9:[2,9],10:[2,10],11:[2,11],25:[2,1],115:[2,4],121:[2,32],167:[2,34],205:[2,35],234:[2,27],240:[2,36],280:[2,29]},
parseError: function parseError(str, hash) {
    if (hash.recoverable) {
        this.trace(str);
    } else {
        throw new Error(str);
    }
},
parse: function parse(input) {
    var self = this, stack = [0], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
    var args = lstack.slice.call(arguments, 1);
    this.lexer.setInput(input);
    this.lexer.yy = this.yy;
    this.yy.lexer = this.lexer;
    this.yy.parser = this;
    if (typeof this.lexer.yylloc == 'undefined') {
        this.lexer.yylloc = {};
    }
    var yyloc = this.lexer.yylloc;
    lstack.push(yyloc);
    var ranges = this.lexer.options && this.lexer.options.ranges;
    if (typeof this.yy.parseError === 'function') {
        this.parseError = this.yy.parseError;
    } else {
        this.parseError = Object.getPrototypeOf(this).parseError;
    }
    function popStack(n) {
        stack.length = stack.length - 2 * n;
        vstack.length = vstack.length - n;
        lstack.length = lstack.length - n;
    }
    function lex() {
        var token;
        token = self.lexer.lex() || EOF;
        if (typeof token !== 'number') {
            token = self.symbols_[token] || token;
        }
        return token;
    }
    var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
    while (true) {
        state = stack[stack.length - 1];
        if (this.defaultActions[state]) {
            action = this.defaultActions[state];
        } else {
            if (symbol === null || typeof symbol == 'undefined') {
                symbol = lex();
            }
            action = table[state] && table[state][symbol];
        }
                    if (typeof action === 'undefined' || !action.length || !action[0]) {
                var errStr = '';
                expected = [];
                for (p in table[state]) {
                    if (this.terminals_[p] && p > TERROR) {
                        expected.push('\'' + this.terminals_[p] + '\'');
                    }
                }
                if (this.lexer.showPosition) {
                    errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + this.lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\'';
                } else {
                    errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\'');
                }
                this.parseError(errStr, {
                    text: this.lexer.match,
                    token: this.terminals_[symbol] || symbol,
                    line: this.lexer.yylineno,
                    loc: yyloc,
                    expected: expected
                });
            }
        if (action[0] instanceof Array && action.length > 1) {
            throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);
        }
        switch (action[0]) {
        case 1:
            stack.push(symbol);
            vstack.push(this.lexer.yytext);
            lstack.push(this.lexer.yylloc);
            stack.push(action[1]);
            symbol = null;
            if (!preErrorSymbol) {
                yyleng = this.lexer.yyleng;
                yytext = this.lexer.yytext;
                yylineno = this.lexer.yylineno;
                yyloc = this.lexer.yylloc;
                if (recovering > 0) {
                    recovering--;
                }
            } else {
                symbol = preErrorSymbol;
                preErrorSymbol = null;
            }
            break;
        case 2:
            len = this.productions_[action[1]][1];
            yyval.$ = vstack[vstack.length - len];
            yyval._$ = {
                first_line: lstack[lstack.length - (len || 1)].first_line,
                last_line: lstack[lstack.length - 1].last_line,
                first_column: lstack[lstack.length - (len || 1)].first_column,
                last_column: lstack[lstack.length - 1].last_column
            };
            if (ranges) {
                yyval._$.range = [
                    lstack[lstack.length - (len || 1)].range[0],
                    lstack[lstack.length - 1].range[1]
                ];
            }
            r = this.performAction.apply(yyval, [
                yytext,
                yyleng,
                yylineno,
                this.yy,
                action[1],
                vstack,
                lstack
            ].concat(args));
            if (typeof r !== 'undefined') {
                return r;
            }
            if (len) {
                stack = stack.slice(0, -1 * len * 2);
                vstack = vstack.slice(0, -1 * len);
                lstack = lstack.slice(0, -1 * len);
            }
            stack.push(this.productions_[action[1]][0]);
            vstack.push(yyval.$);
            lstack.push(yyval._$);
            newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
            stack.push(newState);
            break;
        case 3:
            return true;
        }
    }
    return true;
}};

function Parser () {
  this.yy = {};
}
Parser.prototype = parser;parser.Parser = Parser;
return new Parser;
})();


if (typeof require !== 'undefined' && typeof exports !== 'undefined') {
exports.parser = parser;
exports.Parser = parser.Parser;
exports.parse = function () { return parser.parse.apply(parser, arguments); };
exports.main = function commonjsMain(args) {
    if (!args[1]) {
        console.log('Usage: '+args[0]+' FILE');
        process.exit(1);
    }
    var source = require('fs').readFileSync(require('path').normalize(args[1]), "utf8");
    return exports.parser.parse(source);
};
if (typeof module !== 'undefined' && require.main === module) {
  exports.main(process.argv.slice(1));
}
}
};
require['./sql_parser'] = new function(){
   var exports = this; 
   (function() {

    var buildParser, parser, lexer, nodes;

    nodes = require('./nodes');
    lexer = require('./lexer');

    buildParser = function(opts) {

        var parser;
        parser = require('./gen_parser').parser;
        opts = opts || {};
        parser.args = opts.args || [];
        parser.placeholders = opts.placeholders || [];
        parser.escFn = opts.escFn || function(v) {
            return v;
        };

        parser.lexer = {
            lex: function() {
                var tag, _ref;
                _ref = this.tokens[this.pos++] || [''], tag = _ref[0], this.yytext = _ref[1], this.yylineno = _ref[2];
                return tag;
            },
            setInput: function(tokens) {
                this.tokens = tokens;
                return this.pos = 0;
            },
            upcomingInput: function() {
                return "";
            }
        };

        parser.yy = nodes;
        parser.throwUnMatchedParamsExc = function() {
            return parser.parseError("number of '?'s in statement string does not match argument count", {});
        };

        return parser;

    };

    parser = buildParser();

    exports.parse = function(sql) {
        return parser.parse(lexer.tokenize(sql));
    };

    exports.parse2 = function(sql, opts) {

        var args, paramsLength, placeholders, tokenInfo, tokens;

        tokenInfo = lexer.tokenize2(sql, opts);
        tokens = tokenInfo.tokens;
        placeholders = tokenInfo.placeholders;
        paramsLength = placeholders.length;
        args = opts.args || [];

        if (paramsLength < 1 && args.length < 1) {
            return parser.parse(tokens);
        }

        if (args.length > 0 && paramsLength < 1) {
            parser.throwUnMatchedParamsExc();
        }

        opts.placeholders = placeholders;

        return buildParser(opts).parse(tokens);

    };

    //expose as public properties of sql_parser
    exports.throwUnMatchedParamsExc = parser.throwUnMatchedParamsExc;
    exports.parser = parser;
    exports.lexer = lexer;
    exports.nodes = nodes;

}).call(this);
};
    return require['./sql_parser']
}();

if(typeof define === 'function' && define.amd) {
    define('re_sqlparser', [], function() {
        return baseLib.sqlParser;
    });
}

}, this, 're'));